using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public CaixatipoVO getCaixatipo(int? idCaixaTipo, string caixaTipo)
		{
			CaixatipoVO caixatipoVO = null;
			List<CaixatipoVO> listCaixatipoVOs = getCaixatipos(idCaixaTipo, caixaTipo, null, null);
			if (listCaixatipoVOs != null && listCaixatipoVOs.Count > 0)
			{
				caixatipoVO = listCaixatipoVOs[0];
			}
			return caixatipoVO;
		}

		public CaixatipoVO getCaixatipo(int? idCaixaTipo)
		{
			return getCaixatipo(idCaixaTipo, null);
		}

		public List<CaixatipoVO> getCaixatipos()
		{
			return getCaixatipos(null, null, null, null);
		}

		public List<CaixatipoVO> getCaixatipos(int? idCaixaTipo)
		{
			return getCaixatipos(idCaixaTipo, null, null, null);
		}

		public List<CaixatipoVO> getCaixatipos(int? idCaixaTipo, string caixaTipo)
		{
			return getCaixatipos(idCaixaTipo, caixaTipo, null, null);
		}

		public List<CaixatipoVO> getCaixatipos(int? idCaixaTipo, string caixaTipo, int? idFilial, bool? fiscal)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT cxt.idCaixaTipo as cxt_idCaixaTipo, cxt.caixaTipo as cxt_caixaTipo, cxt.fiscal as cxt_fiscal, cxt.idFilial as cxt_idFilial, fil.filial as fil_filial, cxt.cadastro as cxt_cadastro, cxt.cadastradoPor as cxt_cadastradoPor, cxt.edicao as cxt_edicao, cxt.editadoPor as cxt_editadoPor  ");
			query.AppendLine("FROM caixatipo as cxt LEFT OUTER JOIN filial as fil on cxt.idFilial=fil.idFilial  ");
			if (idCaixaTipo != null)
			{
				query.AppendLine(where + "cxt.idCaixaTipo=@idCaixaTipo ");
				where = "AND ";
			}
			if (caixaTipo != null)
			{
				query.AppendLine(where + "cxt.caixaTipo LIKE @caixaTipo ");
				where = "AND ";
			}
			if (fiscal != null)
			{
				query.AppendLine(where + "cxt.fiscal=@fiscal ");
				where = "AND ";
			}
			if (idFilial != null)
			{
				query.AppendLine(where + "cxt.idFilial=@idFilial ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY cxt.caixaTipo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idCaixaTipo!= null) cmd.Parameters.Add(getParameter(cmd, "@idCaixaTipo", idCaixaTipo));
			if (caixaTipo!= null) cmd.Parameters.Add(getParameter(cmd, "@caixaTipo", "%"+caixaTipo+"%"));
			if (fiscal!= null) cmd.Parameters.Add(getParameter(cmd, "@fiscal", fiscal.Value?"S":"N"));
			if (idFilial!= null) cmd.Parameters.Add(getParameter(cmd, "@idFilial", idFilial));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<CaixatipoVO> listCaixatipo = new List<CaixatipoVO>();

				while (reader.Read())
				{
					CaixatipoVO caixatipoVO = CaixatipoVO.CreateVO();
					caixatipoVO.idCaixaTipo = reader.GetInt32(reader.GetOrdinal("cxt_idCaixaTipo"));
					caixatipoVO.caixaTipo = reader.GetString(reader.GetOrdinal("cxt_caixaTipo"));
					caixatipoVO.fiscal = reader.GetString(reader.GetOrdinal("cxt_fiscal")).Equals("S");
					caixatipoVO.idFilial = reader.GetInt32(reader.GetOrdinal("cxt_idFilial"));
					if (!reader.IsDBNull(reader.GetOrdinal("fil_filial")))
						caixatipoVO.idFilialVO.filial = reader.GetString(reader.GetOrdinal("fil_filial"));
					caixatipoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("cxt_cadastro"));
					caixatipoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("cxt_cadastradoPor"));
					caixatipoVO.edicao = reader.GetDateTime(reader.GetOrdinal("cxt_edicao"));
					caixatipoVO.editadoPor = reader.GetString(reader.GetOrdinal("cxt_editadoPor"));


					listCaixatipo.Add(caixatipoVO);
				}
				reader.Close();
				return listCaixatipo;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setCaixatipo(CaixatipoVO caixatipoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE caixatipo ");
			query.AppendLine("SET caixaTipo=@caixaTipo, fiscal=@fiscal, idFilial=@idFilial,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idCaixaTipo=@idCaixaTipo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixaTipo", caixatipoVO.idCaixaTipo));
			cmd.Parameters.Add(getParameter(cmd, "@caixaTipo", caixatipoVO.caixaTipo));
			cmd.Parameters.Add(getParameter(cmd, "@fiscal", (caixatipoVO.fiscal==null?" ":(caixatipoVO.fiscal.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@idFilial", caixatipoVO.idFilial));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", caixatipoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", caixatipoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", caixatipoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", caixatipoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newCaixatipo(CaixatipoVO caixatipoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO caixatipo ");
			query.AppendLine("  ( caixaTipo, fiscal, idFilial, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @caixaTipo, @fiscal, @idFilial, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@caixaTipo", caixatipoVO.caixaTipo));
			cmd.Parameters.Add(getParameter(cmd, "@fiscal", (caixatipoVO.fiscal==null?" ":(caixatipoVO.fiscal.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@idFilial", caixatipoVO.idFilial));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", caixatipoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", caixatipoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", caixatipoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", caixatipoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('caixatipo') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delCaixatipo(CaixatipoVO caixatipoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM caixatipo ");
			query.AppendLine("WHERE idCaixaTipo=@idCaixaTipo ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixaTipo", caixatipoVO.idCaixaTipo));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountCaixatipoxIdFilial(int? idFilial)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idFilial) as ocorrencias FROM caixatipo WHERE IdFilial=@IdFilial ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdFilial", idFilial));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
